#include <iostream>
#include <string>

using namespace std;

/*
左值 既可以放在等号左边，也可以放在等号右边的值
右值 只能放在等号右边的值

左值 
    val1 = val2
    val2 左值

右值
    常量
    表达式

在 C++ 中的 引用返回值 不能是 局部变量
            返回的引用变量 生命周期不能太短
        可以用的返回

        静态变量
        全局变量
        函数传参 传递的参数 需要是引用
*/


// 使用静态的方式
int & Func_1()
{
    static int val = 10;  // 定义一个静态局部变量 val，并初始化为 10
    return val;        // 返回 val 的引用
    // 静态变量的生命周期贯穿整个程序的执行，因此可以安全地返回其引用
}


// 全局
int num;
int & Func_2()
{
    num = 80;          // 给全局变量 num 赋值为 80
    return num;        // 返回全局变量 num 的引用
    // 全局变量的生命周期是整个程序的执行过程，所以可以安全地返回其引用
}


// 函数传参
int & Func_3(int & val)
{
    return val;        // 返回传入参数 val 的引用
    // 因为传入的参数是引用，其生命周期由调用者决定，所以可以返回其引用
}


int main(int argc, char const *argv[])
{
    // 引用作为返回值 传递给引用 可以修改返回的值
    int & val = Func_2();  // 调用 Func_2 并将返回的引用存储在 val 中
    val = 90;            // 通过引用 val 修改全局变量 num 的值
    cout << num << endl;  // 打印全局变量 num 的值，此时为 90


    // 引用作为返回值 是左值
    Func_2() = 123;       // 直接将 Func_2() 的返回值（即 num 的引用）作为左值，将其赋值为 123
    cout << num << endl;  // 打印全局变量 num 的值，此时为 123


    // 引用的返回值是 参数
    int arg = 10;        // 定义一个局部变量 arg 并初始化为 10
    Func_3(arg) = 50;     // 调用 Func_3 并将其返回的引用（即 arg 的引用）作为左值，将 arg 的值修改为 50
    cout << arg << endl;  // 打印局部变量 arg 的值，此时为 50


    return 0;
}